#include "serial.h"


serial::serial(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::serial)
{
    ui->setupUi(this);

    //串口初始化
    system_init();

    //图表初始化
    ChartInit();

}

serial::~serial()
{
    delete ui;
}


//用户系统初始化
void serial::system_init()
{
    //清空端口所有选项
    ui->cmd_port_name->clear();

    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        //将可用串口添加到端口显示框
        ui->cmd_port_name->addItem(info.portName());
    }

    //设置串口状态标签为红色 表示未连接状态
    ui->lab_status->setStyleSheet("color:red");

    //check port 检测通讯端口
    connect(ui->btn_serial,&QPushButton::clicked,this,&serial::btn_serial_check);
    //open port 打开选择端口
    connect(ui->btn_open,&QPushButton::clicked,this,&serial::btn_open_port);
    //stop port 停止端口
    connect(ui->btn_close,&QPushButton::clicked,this,&serial::btn_close_port);

    //receive data 串口数据接收完触发对应槽函数
    connect(&global_port,&QSerialPort::readyRead,this,&serial::receive_data);

    //clear recevie 清除接收文本框的内容
    connect(ui->btn_clear,&QPushButton::clicked,this,&serial::btn_clear_rev);

}


//检测通讯端口槽函数
void serial::btn_serial_check(bool)
{
    ui->cmd_port_name->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->cmd_port_name->addItem(info.portName());
    }
}

//打开选择端口槽函数
void serial::btn_open_port(bool)
{
    //port name 设置端口
    global_port.setPortName(ui->cmd_port_name->currentText());
    //baud rate 设置波特率为115200
    global_port.setBaudRate(QSerialPort::Baud115200);
    //parity 设置无校验位
    global_port.setParity(QSerialPort::NoParity);
    //data bits 设置数据位8位
    global_port.setDataBits(QSerialPort::Data8);
    //stop bits 设置停止位1位
    global_port.setStopBits(QSerialPort::OneStop);

    //port open 打开选择端口
    bool ret = global_port.open(QIODevice::ReadWrite);

    if(ret){
        //打开成功更新状态
        ui->lab_status->setText("Connected");
        //设置串口状态标签为绿色 表示已连接状态
        ui->lab_status->setStyleSheet("color:green");
    }
}

//关闭选择端口槽函数
void serial::btn_close_port(bool)
{

    global_port.close();

    //关闭端口后显示状态
    ui->lab_status->setText("DisConnected");
    ui->lab_status->setStyleSheet("color:red");
}

float max=0;
//接收数据槽函数，显示对应曲线
void serial::receive_data(void)
{
    QByteArray array = global_port.readAll();
    QString str_rev;



    //搜索第一个数字所在的位置,并截取出来
    QByteArray array1 = array.left(array.indexOf("\r"));
    //搜索第二个数字所在的位置,并截取出来
    QByteArray array2 = array.mid(array.indexOf("\r")+1,array.indexOf("\n")-array.indexOf("\r")-1);

    //更新曲线显示
    if(array1.toFloat()>max) //寻找Y轴最大值
        max=array1.toFloat();
    axisY->setRange(0,1500);
    axisX->setRange(points-200,points);

    series->append(points,array1.toFloat());
    series2->append(points,array2.toFloat());
    points++;
    qDebug() << array;
    qDebug() << array1;
    qDebug() << array2;


    //文本框显示
    if(ui->chk_rev_time->checkState() == Qt::Checked) //是否显示时间
    {
        //获取当前系统时间
        QDateTime nowtime = QDateTime::currentDateTime();
        //时间转换为字符串格式
        str_rev = "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] ";
        //加上接收数据 转换为16进制并空格分开 接收数据换行
        str_rev += QString(array).append("\r\n");
    }
    else
    {
        str_rev += QString(array).append("\r\n");
    }
    ui->pte_rcv->insertPlainText(str_rev);  //将字符串添加到显示文本框

}

//清空接收文本框槽函数
void serial::btn_clear_rev(bool)
{
    ui->pte_rcv->clear();
}

